# 设定模块名称
set(TARGET rpc)

# openssl加密算法库
# 设置OPENSSL的根目录
if (NOT DEFINED OPENSSL_ROOT_DIR)
    set(OPENSSL_ROOT_DIR /usr/local/lib64)
endif ()
# 从根目录寻找cmake配置文件 强制要求版本号 3.5.1
find_package(OpenSSL 3.5.1 EXACT CONFIG REQUIRED)
# 使用OPEN_SSL的静态库
if (OpenSSL_FOUND)
    set(OPENSSL_USE_STATIC_LIBS TRUE)
endif ()

# google测试库
find_package(GTest CONFIG REQUIRED)
# 数据协议封装库
find_package(protobuf CONFIG REQUIRED)

# 远程调用库 （gprg -> protobuf -> absl -> GTest）
find_package(gRPC CONFIG REQUIRED)
set(gRPC_SSL_PROVIDER "package" CACHE STRING "强制gRPC使用外部的OpenSSL")
set(ABSL_PROPAGATE_CXX_STD ON)

# ------------ 当proto文件的内容发生改变时，重新生成框架代码 --------------
# 根据proto文件相对于当前CMakeLists.txt的路径，得到proto文件的绝对路径
#get_filename_component(hw_proto "../../protos/helloworld.proto" ABSOLUTE)
# 获取该文件所在的文件夹的绝对路径
#get_filename_component(hw_proto_path "${hw_proto}" PATH)
# 指定框架代码的生成位置
#set(hw_proto_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.cc")
#set(hw_proto_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.pb.h")
#set(hw_grpc_srcs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.cc")
#set(hw_grpc_hdrs "${CMAKE_CURRENT_BINARY_DIR}/helloworld.grpc.pb.h")
# 监听 DEPENDS 项，如果 DEPENDS 项发生改变时，带上ARGS参数执行COMMAND命令，生成出OUTPUT
add_custom_command(
    OUTPUT
        "${CMAKE_CURRENT_SOURCE_DIR}/src/perception_rpc_client.pb.h"
        "${CMAKE_CURRENT_SOURCE_DIR}/src/perception_rpc_client.pb.cc"
        "${CMAKE_CURRENT_SOURCE_DIR}/src/perception_rpc_client.grpc.pb.h"
        "${CMAKE_CURRENT_SOURCE_DIR}/src/perception_rpc_client.grpc.pb.cc"
    COMMAND "protoc"
    ARGS
        -I "${CMAKE_CURRENT_SOURCE_DIR}/proto"
        "perception_rpc_client.proto"
        --grpc_out "${CMAKE_CURRENT_SOURCE_DIR}/src"
        --cpp_out "${CMAKE_CURRENT_SOURCE_DIR}/src"
        --plugin=protoc-gen-grpc="/usr/local/bin/grpc_cpp_plugin"
    DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/proto/perception_rpc_client.proto"
    COMMENT "利用protoc命令，编译 perception_rpc_client.proto 文件，在指定目录下生成对应c++源码文件"
)
# 监听 DEPENDS 项，如果 DEPENDS 项发生改变时，带上ARGS参数执行COMMAND命令，生成出OUTPUT
#add_custom_command(
#    OUTPUT
#        "${CMAKE_CURRENT_SOURCE_DIR}/src/network_prober.pb.h"
#        "${CMAKE_CURRENT_SOURCE_DIR}/src/network_prober.pb.cc"
#        "${CMAKE_CURRENT_SOURCE_DIR}/src/network_prober.grpc.pb.h"
#        "${CMAKE_CURRENT_SOURCE_DIR}/src/network_prober.grpc.pb.cc"
#    COMMAND "protoc"
#    ARGS
#        -I "${CMAKE_CURRENT_SOURCE_DIR}/proto"
#        "network_prober.proto"
#        --grpc_out "${CMAKE_CURRENT_SOURCE_DIR}/src"
#        --cpp_out "${CMAKE_CURRENT_SOURCE_DIR}/src"
#        --plugin=protoc-gen-grpc="/usr/local/bin/grpc_cpp_plugin"
#    DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/proto/network_prober.proto"
#    COMMENT "利用protoc命令，编译 network_prober.proto 文件，在指定目录下生成对应c++源码文件"
#)

# 在src目录下搜集源码文件
aux_source_directory(src SOURCE_FILES)

# 将模块打包成静态库
add_library(${TARGET}
    STATIC
        ${SOURCE_FILES}
)

# 给模块起个别名，便与其他模块引用(原名的目标依然存在)
add_library(${PROJECT_NAME}::${TARGET} ALIAS ${TARGET})

target_include_directories(${TARGET}
    PUBLIC
        include
)

# 为模块添加依赖
target_link_libraries(${TARGET}
    PRIVATE
        Boost::format   # 格式化
        Boost::json
        gRPC::grpc++    # grpc
        libcorn::corn   # 定时器
        asio2   # 网络框架
#        gRPC::gprc++_reflection
#        PcapPlusPlus::Pcap++ # 静态库
#        libssh2::libssh2_static # ssh协议远程连接库
#        libtelnet   # telnet协议远程连接库
        go::telnet # ssh和telnet通信
        libmysqlclient.so   # mysql连接库
        libpq.so  # PostgreSQL连接库
        ${PROJECT_NAME}::logger
        ${PROJECT_NAME}::sys_config
        ${PROJECT_NAME}::utils
        ${PROJECT_NAME}::database
        ${PROJECT_NAME}::probe_detect
        ${PROJECT_NAME}::backup_test
)

# 给模块增加预编译头文件
target_precompile_headers(${TARGET}
    PRIVATE
        ${PROJECT_INCLUDE_DIR}/pre_compiled.h
)